package hello.jni;

/**
 * <h5>操作步骤</h5>
 * <ol>
 * <li>编写 Java 代码
 * <p>
 * JNI 方法使用 native 关键字进行声明，表明这个方法使用 java 以外的语言实现； System.loadLibrary()
 * 是在静态初始化块中定义的，系统用它来装载 JNI 共享库
 * </p>
 * </li>
 * <li>编译 Java 代码</li>
 * <li>创建 .h 文件
 * <p>
 * <code>javah -d include -cp bin hello.jni.HelloWorld</code>
 * </p>
 * </li>
 * <li>编写本地实现代码</li>
 * <li>运行测试</li>
 * </ol>
 * <h5>常见错误</h5>
 * <p>
 * DLL 加载路径不正确；方法名称拼写错了
 * </p>
 * 
 * @author hemj
 * @date 2016年9月22日
 */
public class HelloWorld {

	public native void displayHelloWorld();

	public native int typeTest(int i, long l, char c, boolean b, float f, double d);

	public native void addStu(Student student);

	public native void editStu(Student student);

	public native Student getStu(String name);

	static {
		System.loadLibrary("lib/HelloJNI");
	}

	public static void main(String[] args) {
		HelloWorld hello = new HelloWorld();
		hello.displayHelloWorld();
		hello.typeTest(1, 2, '3', true, 100.01f, 100.06);
		hello.typeTest(1, 2, '3', false, 100.01f, 100.06);

		Student student = new Student();
		student.setName("stu");
		student.setAge(9);
		hello.addStu(student);
		Student stu1 = hello.getStu("stu");
		// toString() 重写没效果
		System.out.println(stu1.toString()); // hello.jni.HelloWorld@15db9742

		student.setAge(13);
		hello.editStu(student);
		Student stu2 = hello.getStu("stu");
		System.out.println(stu2.getAge());
	}
}
